/**
 * Namespace responsável pela manipulação de elementos DOM.
 * 
 * @name jProton.element
 * @namespace
 */
jProton.namespace('jProton.element');

// Atalho para jProton.element
var element = jProton.element;


// Extensão dom para jProton.element.
/**#@+ @extends dom */
jProton.extend(element, /** @lends jProton.element */ {
  '@extension': {'dom': '0.3.0a'},
  
  /**
   * Retorna o valor da propriedade do elemento.
   *      
   * @name attr
   * @param  {Element}  e     Elemento alvo.         
   * @param  {String}   key   Nome da propiedade.
   * @return {Value}
   */
     
  /**
   * Altera o valor da proriedade do elemento.
   * 
   * @param  {Element}  e     Elemento alvo.         
   * @param  {String}   key   Nome da propiedade.
   * @param  {Value}    val   Valor a ser definido.
   */
  attr: function(e, key, val) {
    return e ? val ? e[key] = val : e[key] : undefined;
  },
  
  /**
   * Retorna o valor da propriedade 'value' do elemento.
   *    
   * @name val
   * @memberOf jProton.element;
   * @param  {Element}  e     Elemento alvo.         
   * @return {Value}
   */
   
  /**
   * Altera valor da propriedade "value" do elemento. Se o elemento em questão 
   * for do tipo "select options", a opção com o mesmo valor será selecionada.  
   *    
   * @name val
   * @memberOf jProton.element;
   * @param {Element} e    elemento alvo.         
   * @param {String}  val  valor a ser atrubuído a propriedade "value".
   */
           
  /**
   * Marca ou seleciona elementos do tipo "select options", "checkbox" ou 
   * "radio button".
   * 
   * ~~
   * // Seleciona as opções 'Multiple2' e 'Multiple3' do select de id 'multiple'   
   * $('#multiple').val(['Multiple2', 'Multiple3']);
   *    
   * // Marca o checkbox de valor 'check2' e o radio button de valor 'radio1'
   * $('input').val(['check2', 'radio1']);
   * ~~
   * 
   * @param {Element} e        Elemento alvo.         
   * @param {Array}   values   Array de Strings com os valores dos elementos
   *                           que serão marcados ou selecionados.
   *                        
   * @return {jProton.query}
   */
  val: function(e, val) {
    if (e) {
      // processa $().val(val)
      if (val) {
        var valType = typeof val;
  
        // processa $().val(String)
        if (valType == 'string')
          e.value = val;
  
        // processa $().val(Array)
        else if (valType == 'object') {
          var vl = val.length, tag, type;
  
          // seleciona um ou mais elementos 'checkbox' ou 'radio'
          if ((tag = e.nodeName.toLowerCase()) == 'input' && 
              ((type = e.type) == 'checkbox' || type == 'radio')) {
            e.checked = false;
            for (var j=0; j < vl; j++)
              if (e.value == val[j])
                e.checked = true;
  
          // seleciona uma ou mais opções do elemento 'select'
          } else if (tag == 'select') {
            for (var o=0, op, op=e.options, ol=o.length; o<ol; o++) {
              if (e.multiple) 
                op[o].selected = false;
  
              for (var j=0; j < vl; j++)
                if (op[o].value == val[j])
                  op[o].selected = true;
            }
          }
        }
      // processa $().val()
      } else {
        // se for um elemento comum, retorna seu valor
        if (e.nodeName.toLowerCase() != 'select')
          return e.value;
  
        // se for um elemento 'select' retorna as opções selecionadas
        else {
          var r = new Array();
          for (var i=0, o=e.options, ol=o.length; i<ol; i++)
            if (o[i].selected)
              r.push(o[i].value);
  
          return e.multiple ? r : r[0];
        }
      }
    } else
      return undefined;
  },
  
  /**
   * Retorna o conteúdo de texto do elemento.
   *    
   * @name text
   * @param  {Element} e   Elemento alvo.         
   * @return {String}
   */

  /**
   * Aletar o conteúdo de texto do elemento.
   * 
   * @name text
   * @param {Element} e    Elemento alvo.         
   * @param {String}  val  Conteúdo de texto a ser atribuído.
   * @return {jProton.query}
   */
  text: (function() {
    var txt = typeof document.textContent != 'undefined' ?
        'textContent' : 'innerText';

    var text = function(e, val) {
      return e ? val ? e[txt] = val : e[txt] : undefined;
    };

    return text;
  })()

  /**#@-*/
});
